/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.swak.boot.config.dubbo;

import static com.swak.boot.config.dubbo.DubboUtils.DEFAULT_MULTIPLE_CONFIG_PROPERTY_VALUE;
import static com.swak.boot.config.dubbo.DubboUtils.DEFAULT_OVERRIDE_CONFIG_PROPERTY_VALUE;
import static com.swak.boot.config.dubbo.DubboUtils.DUBBO_PREFIX;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConsumerConfig;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.ModuleConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.spring.ConfigCenterBean;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

/**
 * Dubbo {@link ConfigurationProperties Config Properties} only used to generate
 * JSON metadata(non-public class)
 *
 * 这个配置没有实际的作用，仅仅开始springboot 的提示
 * 
 * @since 2.7.1
 */
@ConfigurationProperties(DUBBO_PREFIX)
public class DubboConfigurationProperties {

	@NestedConfigurationProperty
	private Config config = new Config();

	@NestedConfigurationProperty
	private Scan scan = new Scan();

	// Single Config Bindings
	@NestedConfigurationProperty
	private ApplicationConfig application = new ApplicationConfig();

	@NestedConfigurationProperty
	private ModuleConfig module = new ModuleConfig();

	@NestedConfigurationProperty
	private RegistryConfig registry = new RegistryConfig();

	@NestedConfigurationProperty
	private ProtocolConfig protocol = new ProtocolConfig();

	@NestedConfigurationProperty
	private MonitorConfig monitor = new MonitorConfig();

	@NestedConfigurationProperty
	private ProviderConfig provider = new ProviderConfig();

	@NestedConfigurationProperty
	private ConsumerConfig consumer = new ConsumerConfig();

	@NestedConfigurationProperty
	private ConfigCenterBean configCenter = new ConfigCenterBean();

	@NestedConfigurationProperty
	private MetadataReportConfig metadataReport = new MetadataReportConfig();

	// Multiple Config Bindings

	private Map<String, ModuleConfig> modules = new LinkedHashMap<>();

	private Map<String, RegistryConfig> registries = new LinkedHashMap<>();

	private Map<String, ProtocolConfig> protocols = new LinkedHashMap<>();

	private Map<String, MonitorConfig> monitors = new LinkedHashMap<>();

	private Map<String, ProviderConfig> providers = new LinkedHashMap<>();

	private Map<String, ConsumerConfig> consumers = new LinkedHashMap<>();

	private Map<String, ConfigCenterBean> configCenters = new LinkedHashMap<>();

	private Map<String, MetadataReportConfig> metadataReports = new LinkedHashMap<>();

	public Config getConfig() {
		return config;
	}

	public void setConfig(Config config) {
		this.config = config;
	}

	public Scan getScan() {
		return scan;
	}

	public void setScan(Scan scan) {
		this.scan = scan;
	}

	public ApplicationConfig getApplication() {
		return application;
	}

	public void setApplication(ApplicationConfig application) {
		this.application = application;
	}

	public ModuleConfig getModule() {
		return module;
	}

	public void setModule(ModuleConfig module) {
		this.module = module;
	}

	public RegistryConfig getRegistry() {
		return registry;
	}

	public void setRegistry(RegistryConfig registry) {
		this.registry = registry;
	}

	public ProtocolConfig getProtocol() {
		return protocol;
	}

	public void setProtocol(ProtocolConfig protocol) {
		this.protocol = protocol;
	}

	public MonitorConfig getMonitor() {
		return monitor;
	}

	public void setMonitor(MonitorConfig monitor) {
		this.monitor = monitor;
	}

	public ProviderConfig getProvider() {
		return provider;
	}

	public void setProvider(ProviderConfig provider) {
		this.provider = provider;
	}

	public ConsumerConfig getConsumer() {
		return consumer;
	}

	public void setConsumer(ConsumerConfig consumer) {
		this.consumer = consumer;
	}

	public ConfigCenterBean getConfigCenter() {
		return configCenter;
	}

	public void setConfigCenter(ConfigCenterBean configCenter) {
		this.configCenter = configCenter;
	}

	public MetadataReportConfig getMetadataReport() {
		return metadataReport;
	}

	public void setMetadataReport(MetadataReportConfig metadataReport) {
		this.metadataReport = metadataReport;
	}

	public Map<String, ModuleConfig> getModules() {
		return modules;
	}

	public void setModules(Map<String, ModuleConfig> modules) {
		this.modules = modules;
	}

	public Map<String, RegistryConfig> getRegistries() {
		return registries;
	}

	public void setRegistries(Map<String, RegistryConfig> registries) {
		this.registries = registries;
	}

	public Map<String, ProtocolConfig> getProtocols() {
		return protocols;
	}

	public void setProtocols(Map<String, ProtocolConfig> protocols) {
		this.protocols = protocols;
	}

	public Map<String, MonitorConfig> getMonitors() {
		return monitors;
	}

	public void setMonitors(Map<String, MonitorConfig> monitors) {
		this.monitors = monitors;
	}

	public Map<String, ProviderConfig> getProviders() {
		return providers;
	}

	public void setProviders(Map<String, ProviderConfig> providers) {
		this.providers = providers;
	}

	public Map<String, ConsumerConfig> getConsumers() {
		return consumers;
	}

	public void setConsumers(Map<String, ConsumerConfig> consumers) {
		this.consumers = consumers;
	}

	public Map<String, ConfigCenterBean> getConfigCenters() {
		return configCenters;
	}

	public void setConfigCenters(Map<String, ConfigCenterBean> configCenters) {
		this.configCenters = configCenters;
	}

	public Map<String, MetadataReportConfig> getMetadataReports() {
		return metadataReports;
	}

	public void setMetadataReports(Map<String, MetadataReportConfig> metadataReports) {
		this.metadataReports = metadataReports;
	}

	static class Config {

		/**
		 * Indicates multiple properties binding from externalized configuration or not.
		 */
		@SuppressWarnings("deprecation")
		private boolean multiple = DEFAULT_MULTIPLE_CONFIG_PROPERTY_VALUE;

		/**
		 * The property name of override Dubbo config
		 */
		private boolean override = DEFAULT_OVERRIDE_CONFIG_PROPERTY_VALUE;

		public boolean isOverride() {
			return override;
		}

		public void setOverride(boolean override) {
			this.override = override;
		}

		public boolean isMultiple() {
			return multiple;
		}

		public void setMultiple(boolean multiple) {
			this.multiple = multiple;
		}
	}

	static class Scan {

		/**
		 * The basePackages to scan , the multiple-value is delimited by comma
		 *
		 * @see EnableDubbo#scanBasePackages()
		 */
		private Set<String> basePackages = new LinkedHashSet<>();

		public Set<String> getBasePackages() {
			return basePackages;
		}

		public void setBasePackages(Set<String> basePackages) {
			this.basePackages = basePackages;
		}
	}
}
